#include "rclcpp/rclcpp.hpp" // 包含 ROS 2 的核心库，用于节点管理等
#include "std_msgs/msg/string.hpp" // 包含 std_msgs 中的 String 消息类型定义

using namespace std::chrono_literals; // 使用命名空间，允许直接使用毫秒、秒等时间单位

class TalkerNode : public rclcpp::Node { // 定义一个名为 TalkerNode 的类，继承自 rclcpp::Node
public:
    TalkerNode() : Node("TalkerNode") { // 构造函数，初始化节点名为 "TalkerNode"
        publisher_ = this->create_publisher<std_msgs::msg::String>("aimoe_topic", 10); // 创建一个发布者，发布到 "aimoe_topic"，队列大小为10

        timer_ = this->create_wall_timer(500ms, std::bind(&TalkerNode::time_callback, this)); // 创建一个定时器，每500毫秒触发一次 time_callback 回调
    }

private:
    void time_callback() { // 定时器回调函数
        auto message = std_msgs::msg::String(); // 创建一个 String 类型的消息
        message.data = "hahaha"; // 设置消息的数据内容为 "hahaha"
        RCLCPP_INFO(this->get_logger(), "send: %s", message.data.c_str()); // 使用 ROS 2 日志记录发送的消息内容
        publisher_->publish(message); // 发布消息
    }
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_; // 定义发布者成员变量
    rclcpp::TimerBase::SharedPtr timer_; // 定义定时器成员变量
}; // 类定义结束，注意这里需要分号

int main(int argc, char **argv) { // 主函数
    rclcpp::init(argc, argv); // 初始化 ROS 2 通信
    rclcpp::spin(std::make_shared<TalkerNode>()); // 运行节点，直到节点被关闭
    rclcpp::shutdown(); // 关闭 ROS 2 通信
    return 0; // 返回0，表示程序正常结束
}
